#include <functional>
#include <iostream>

void f(int &n1, int &n2, const int &n3)
{
    std::cout << "In function: " << n1 << ' ' << n2 << ' ' << n3 << '\n';
    ++n1; // increments the copy of n1 stored in the function object
    ++n2; // increments the main()'s n2
}

int main()
{
    int n1 = 1, n2 = 2, n3 = 3;
    std::function<void()> bound_f = std::bind(f, n1, std::ref(n2), std::cref(n3));
    n1 = 4;
    n2 = 5;
    n3 = 6;
    std::cout << "Before function: " << n1 << ' ' << n2 << ' ' << n3 << '\n';
    bound_f();
    std::cout << "After function: " << n1 << ' ' << n2 << ' ' << n3 << '\n';
}

// 得到的答案为：

// Before function: 4 5 6
// In function: 1 5 6
// After function: 4 6 6

// 考虑了函数式编程(如std::bind)在使用时，是对参数直接拷贝，而不是引用; ---> std::reference_wrapper 用于按引用传递对象给 std::bind 或 std::thread 的构造函数
// 具体可以参照这一句话：std::reference_wrapper 用于按引用传递对象给 std::bind 或 std::thread 的构造函数

// 上述代码在执行std::bind后，在函数f()中n1的值仍然是1，n2和n3改成了修改的值。
// 说明std::bind使用的是参数的拷贝而不是引用。C++11的设计者认为bind默认应该采用拷贝，如果使用者有需求，加上std::ref()即可。同理std::thread也是这样。
